package cn.zk.commom.tcp.obd;

import cn.zk.commom.tcp.obd.ObdAnalyse;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import io.netty.handler.codec.ReplayingDecoder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.io.UnsupportedEncodingException;
import java.util.List;

@Slf4j
@Component
public class ObdDecoder extends ByteToMessageDecoder {

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf buf, List<Object> out) throws Exception {
        log.info("...............开始解码...............");
//        //判断头是否符合
//        buf.markReaderIndex();
//        // 有上次残留数据包开头的情况（这样可能会丢包）
//        byte start = buf.readByte();
//        if (start != (byte) 0x7e) {
//            log.info("当前数据包开头===>{},非0x7e开头",start);
//            //return;
//        }
//        buf.setIndex(0, buf.capacity());
//        byte[] bytes = new byte[buf.readableBytes()];
//        buf.readBytes(bytes);
//        out.add(bytes);


        // 获取channel对应的obdAnalyse
        ObdAnalyse obdAnalyse = ObdServerHandler.obdAnalyseMap.get(ctx.channel().id());
        log.info("obdAnalyse==>{}",obdAnalyse.hashCode());
        // 解码
        buf.markReaderIndex();
        // 有上次残留数据包开头的情况
        byte start = buf.readByte();
        if (start != (byte) 0x7e) {
            log.info("当前数据包开头===>{},非0x7e开头",start);
        }
        buf.setIndex(0, buf.capacity());
        byte[] bytes = new byte[buf.readableBytes()];
        buf.readBytes(bytes);

        byte[] alyseRet = obdAnalyse.AnalyseTcpData(bytes);
        if(null == alyseRet){
            return;
        }
        obdAnalyse.ObdInfo(alyseRet);
        // 交给下一个handler处理
        out.add(obdAnalyse);

    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        log.info("...............数据解析异常 ...............");
        log.error("数据解析异常==>",cause.getStackTrace());
        cause.printStackTrace();
//        ctx.close();
    }

    /**
     * ByteBuf转String
     *
     * @param buf
     * @return
     * @throws UnsupportedEncodingException
     */
    public String convertByteBufToString(ByteBuf buf) throws UnsupportedEncodingException {
        String str;
        if (buf.hasArray()) { // 处理堆缓冲区
            str = new String(buf.array(), buf.arrayOffset() + buf.readerIndex(), buf.readableBytes());
        } else { // 处理直接缓冲区以及复合缓冲区
            byte[] bytes = new byte[buf.readableBytes()];
            buf.getBytes(buf.readerIndex(), bytes);
            str = new String(bytes, 0, buf.readableBytes());
        }
        return str;
    }

}
